package com.qf.fmall.order.service.impl;

import com.qf.fmall.order.entity.OrderItem;
import com.qf.fmall.order.entity.Orders;
import com.qf.fmall.order.mapper.OrderItemMapper;
import com.qf.fmall.order.mapper.OrdersMapper;
import com.qf.fmall.order.service.IOrdersService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.fmall.product.entity.ProductSku;
import com.qf.fmall.product.mapper.ProductSkuMapper;
import com.qf.fmall.shopcart.mapper.ShoppingCartMapper;
import com.qf.fmall.shopcart.vo.ShopcartListResponseVo;
import com.qf.fmall.utils.WxpayUtils;
import com.qf.fmall.vo.ResultVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

/**
 * <p>
 * 订单  服务实现类
 * </p>
 *
 * @author djl
 * @since 2024-04-30
 */
@Service
public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersService {

    @Autowired
    private ShoppingCartMapper shoppingCartMapper;

    @Autowired
    private ProductSkuMapper productSkuMapper;

    @Autowired
    private OrderItemMapper orderItemMapper;

    @Transactional  // 控制数据库事务，使得这个方法中的所有sql语句在同一个数据库事务中，保证原子性（要么同时成功，要同时失败）
    @Override
    public HashMap<String, String> addOrder(Integer[] cids, Orders order) throws ParseException {

        //1. 扣库存
        // 同时把商品的名称取出来
        StringBuffer productNames = new StringBuffer();
        List<ShopcartListResponseVo> cartList = shoppingCartMapper.listbycids(cids);
        for (ShopcartListResponseVo cart : cartList) {
            String skuId = cart.getSkuId();
            String cartNum = cart.getCartNum();
            Integer stock = cart.getStock();
            // 剩余库存
            int remainStock = stock - Integer.valueOf(cartNum);

            ProductSku productSku = new ProductSku();
            productSku.setSkuId(Integer.valueOf(skuId));
            productSku.setStock(remainStock);
            productSkuMapper.updateById(productSku);

            // 处理商品名称
            String productName = cart.getProductName();
            productNames.append(productName+",");
        }

        //2. 生成订单主表数据并且写入
        // 生成订单ID ，注意，要保证唯一性
        String orderID = UUID.randomUUID().toString().replaceAll("-", "");
        order.setOrderId(orderID);

        // 处理订单的商品名称
        // 去掉最后一个逗号
        String pName = productNames.toString();
        pName = pName.substring(0, pName.length() - 1);
        order.setUntitled(pName);

        // 订单状态，默认为1，待付款
        order.setStatus("1");
        // 下单时间
        Date date = new Date();
        order.setCreateTime(date);
        // 更新时间
        order.setCreateTime(date);

        // 写入订单主表
        this.save(order);

        //3. 生成订单明细表数据，并且写入
        for (ShopcartListResponseVo vo : cartList) {
            // 把vo中对应的信息，创建成一个orderItem对象
            OrderItem orderItem = new OrderItem();
            // 主键
            orderItem.setItemId(UUID.randomUUID().toString().replaceAll("-",""));
            // 设置当前的订单明细属于哪个订单
            orderItem.setOrderId(orderID);
            orderItem.setProductId(vo.getProductId()+"");
//            orderItem.setProductName(vo.getProductName());
//            orderItem.setProductImg(vo.getProductImg());
//            orderItem.setSkuId(vo.getSkuId());
            // 把同名的属性从一个对象拷贝到另一个对象
            BeanUtils.copyProperties(vo,orderItem);
//            orderItem.setProductPrice(vo.getProductPrice());
            orderItem.setBuyCounts(Integer.valueOf(vo.getCartNum()));
            // 总金额= 购买数量*价格
            orderItem.setTotalAmount(new BigDecimal(vo.getCartNum()).multiply(new BigDecimal(vo.getProductPrice()+"")));

            // 时间字符串转换为Date对象
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date cartDate = simpleDateFormat.parse(vo.getCartTime());
            orderItem.setBasketDate(cartDate);
            orderItem.setIsComment(0);

            // 写表
            orderItemMapper.insert(orderItem);
        }

        //4. 删除购物车中的数据
        for (int i = 0; i < cids.length; i++) {
            shoppingCartMapper.deleteById(cids[i]);
        }
        //5. 调用微信支付的统一下单接口获取支付二维码对应的url
        String payurl = createPayUrl(orderID,pName,order.getActualAmount());
        //6. 返回数据
        HashMap<String, String> map = new HashMap<>();
        map.put("orderId",orderID);
        map.put("productNames",pName);
        map.put("payUrl",payurl);
        return map;
    }

    @Override
    public String queryOrder(String orderid) {

        //1. 调用微信支付平台的查询订单状态接口
        String status = WxpayUtils.queryOrder(orderid);
        String data = "-1";
        if (status.equals("SUCCESS")){
            data ="2"; // 前端约定，返回2代表支付成功
        }
        //2. 如果订单支付成功，需要修改哪些表的数据

        return data;
    }

    private String createPayUrl(String orderID, String pName, Integer actualAmount) {
        return WxpayUtils.getPayurl(orderID,pName,actualAmount);
    }
}
